package com.zeus.gen.base.service;

import com.zeus.gen.base.dto.Query;
import com.zeus.gen.base.model.BaseModel;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

/**
 * BaseService接口
 *
 * @author
 */
public interface BaseService<T extends BaseModel> {

    /**
     * 根据id查找未删除的对象
     *
     * @param id
     * @return 对象
     */
    T findObjById(Serializable id);

    /**
     * 根据默认条件查找对象
     *
     * @return 对象
     */
    T findObj();

    /**
     * 根据条件查找对象
     *
     * @param query 查询条件
     * @return 对象
     */
    T findObj(Query query);

    /**
     * 根据条件查询对象
     *
     * @param query 查询条件
     * @param sqlId sqlId
     * @return 对象
     */
    T findObj(Query query, String sqlId);

    /**
     * 根据条件查询对象(返回map结果)
     *
     * @param query
     * @param sqlId
     * @param mapKey
     * @return
     */
    <K, V> Map<K, V> findMap(Query query, String sqlId, String mapKey);

    /**
     * 查询对象
     * @param query
     * @param sqlId
     * @param <E>
     * @return
     */
    <E> E findOne(Query query, String sqlId);

    /**
     * 根据条件统计数量
     *
     * @param query
     * @return
     */
    int count(Query query);

    /**
     * 根据条件统计数量
     *
     * @param query
     * @param sqlId
     * @return
     */
    int count(Query query, String sqlId);

    /**
     * 根据默认条件查找对象列表
     *
     * @return 对象list
     */
    <E> List<E> findList();

    /**
     * 根据条件查找对象列表
     *
     * @param query 查询条件
     * @return 对象list
     */
    <E> List<E> findList(Query query);

    /**
     * 根据条件查找对象列表
     *
     * @param query        查询条件
     * @param includeCount 是否包含总数
     * @return 对象list
     */
    <E> List<E> findList(Query query, boolean includeCount);

    /**
     * 根据条件查找对象列表
     *
     * @param query 查询条件
     * @param sqlId 自定义sqlId
     * @return 对象list
     */
    <E> List<E> findList(Query query, String sqlId);

    /**
     * 根据条件查找对象列表
     *
     * @param query        查询条件
     * @param sqlId        自定义sqlId
     * @param includeCount 是否包含总数
     * @return 对象list
     */
    <E> List<E> findList(Query query, String sqlId, boolean includeCount);

    /**
     * 保存到数据库中
     *
     * @param obj 对象
     * @return 保存对象的id
     */
    int save(T obj);

    /**
     * 保存到数据库中
     *
     * @param obj   对象
     * @param sqlId sqlId
     * @return 保存对象的id
     */
    int save(T obj, String sqlId);

    /**
     * 修改数据库中值
     *
     * @param obj 对象
     * @return 修改记录条数
     */
    int update(T obj);

    /**
     * 修改数据库中值
     *
     * @param obj   对象
     * @param sqlId sqlId
     * @return 修改记录条数
     */
    int update(T obj, String sqlId);

    /**
     * 根据入参修改数据库中值
     *
     * @param obj 对象
     * @return 修改记录条数
     * @
     */
    int updateSelective(T obj);

    /**
     * 新增或者修改
     *
     * @param obj 对象
     * @return 修改记录条数
     */
    int saveOrUpdate(T obj);

    /**
     * 根据入参修改数据库中值
     *
     * @param obj   对象
     * @param sqlId sql语句的id
     * @return 修改记录条数
     * @
     */
    int updateSelective(T obj, String sqlId);

    /**
     * 批量修改
     *
     * @param idList id集合
     * @param obj
     * @return 修改条数
     * @
     */
    int batchUpdate(List<? extends Serializable> idList, Object obj);

    /**
     * 批量修改
     *
     * @param idList id集合
     * @param obj
     * @param sqlId  sql语句的id
     * @return 修改条数
     * @
     */
    int batchUpdate(List<? extends Serializable> idList, Object obj, String sqlId);

    /**
     * 硬删除
     *
     * @param id
     * @return 删除记录条数
     */
    int delete(Serializable id);

    /**
     * 硬删除
     *
     * @param id
     * @param sqlId
     * @return 删除记录条数
     */
    int delete(Serializable id, String sqlId);

    /**
     * 硬删除
     *
     * @param obj 实体对象实例，执行delete语句
     * @return 删除记录条数
     */
    int delete(T obj);

    /**
     * 硬删除
     *
     * @param obj   实体对象实例
     * @param sqlId sql标识，若为空时调用delete语句
     * @return 删除对象条数
     */
    int delete(T obj, String sqlId);
}